package com.ngc.mall.common.interceptor;

import com.ngc.mall.common.annotation.PreAuthorize;
import com.ngc.mall.common.configure.LocalUser;
import com.ngc.mall.common.configure.exception.BusinessException;
import com.ngc.mall.common.configure.response.ResponseCode;
import com.ngc.mall.service.impl.MenuServiceImpl;
import com.ngc.mall.service.impl.UserServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerInterceptor;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.lang.reflect.Method;

/**
 *
 * 自定义权限拦截器
 * @author: chenxiaolin
 * @date 2023/10/27 10:23
**/
@Component
public class PreAuthorizeInterceptor implements HandlerInterceptor {
    @Resource
    private UserServiceImpl userService;

    @Autowired
    private MenuServiceImpl menuService;
    // 在调用方法之前执行拦截
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//        System.out.println("经过了RoleInterceptor拦截器");

        // 将handler强转为HandlerMethod, 前面已经证实这个handler就是HandlerMethod
        HandlerMethod handlerMethod = (HandlerMethod) handler;
        // 从方法处理器中获取出要调用的方法
        Method method = handlerMethod.getMethod();

        // 获取出方法上的Role注解
        PreAuthorize preAuthorize = method.getAnnotation(PreAuthorize.class);
        // 如果注解为null, 说明不需要拦截, 直接放过
        if (preAuthorize == null) {
            return true;
        }

        Long userId= LocalUser.getLocalUser().getId();
        // 没有信息说明没有登陆
        if (userId == null) {
            //自定义登录异常yu
            throw new BusinessException(ResponseCode.USER_NOT_LOGGED_IN);
        }

//        // 到数据库权限表中查询用户拥有的角色集合, 进行对比完成权限校验
//        List<Long> userRole =this.userService.getRoleIdListByUid(userId);
//
//        if (userRole != null && userRole.size()>0) {
//            List<MenuDomain> userMenu=this.menuService.findMenuByMySelf(userRole);
//            if(!userMenu.isEmpty()){
//                for(MenuDomain menuDomain:userMenu){
//                    String value=preAuthorize.value();
//                    if(value.equals(menuDomain.getPermission())){
//                        return true;
//                    }
//                }
//            }
//
//        }
//
//        // 说明没登录抛出自定义的角色异常,没有自定义异常可以直接返回false,代码就不会执行下去
//        throw new BusinessException(ResponseCode.PERMISSION_NO_ACCESS);

        // 拦截之后应该返回公共结果, 这里没做处理
         return false;
    }
}
